#include <cmodule.hpp>
#include <cmodule_mgr.hpp>
#include <msg.hpp>

 CModule::CModule():
 m_run(false),
 m_moduleId(0){

 }

 CModule::~CModule(){

}

void   CModule::handle_msg(CMsg_Ptr pMsg){
    
}

CMsg_Ptr  CModule::get_msg(){
    CMsg_Ptr pMsg = nullptr;
    unique_lock<mutex> ul(m_msgMutex);
    m_msgCond.wait(ul, [this] {
        return !m_msgs.empty();});
    pMsg = m_msgs.front();
    m_msgs.pop_front();
    return pMsg;
}

void CModule::put_msg(CMsg_Ptr pMsg,bool bFirst){
    unique_lock<mutex> ul(m_msgMutex);
    if(false == bFirst)
        m_msgs.push_back(pMsg);
    else
        m_msgs.push_front(pMsg);
    m_msgCond.notify_all();
}

void CModule::clear_msgs(){
    unique_lock<mutex> ul(m_msgMutex);
    m_msgs.clear();
}

void CModule::start(){
    m_run = true;
    m_pTid.reset(new thread(CModule::run,m_moduleId));
    m_pTid->detach();
}
    
void CModule::stop(){
    m_run = false;
}


void CModule::adjust_priority(int priority_){
     if(m_pTid != nullptr){
        struct sched_param param;
        //param.sched_priority = priority_;
        param.sched_priority = sched_get_priority_max(SCHED_RR);
        pthread_setschedparam(m_pTid->native_handle(), SCHED_RR, &param);
     }
}

void CModule::run(int moduleId){
    CModule_Mgr_Ptr pMsgMgr = CModule_Mgr::getInstance();
    CModule_Ptr pModule = CModule_Mgr::getInstance()->get_module(moduleId);
    //printf("CModule::run moduleId[%08x]\n",moduleId);
    if(nullptr != pModule){
        while (pModule->m_run){
            CMsg_Ptr pMsg = pModule->get_msg();
            pModule->handle_msg(pMsg);
        }
    }else{
        //printf("CModule::run moduleId[%08x] null\n",moduleId); 
    }
}